import {BaseService} from 'egg-cool-service';

/**
 * 商品-品牌
 */
export default class GoodsBrandService extends BaseService {

    /**
     * 新增
     * @param param
     */
    async add (param) {
        await this.getRepo ().goods.Brand.save (param);
    }

    /**
     * 分类排序
     * @param params
     */
    async order (params) {
        for (const e of params) {
            await this.getRepo ().goods.Brand.update (e.id , e);
        }
    }

    /**
     * 获得brand菜单
     */
    async list () {
        let {indexes} = this.getQuery ();
        const list = await this.nativeQuery (`
        SELECT
            *
            FROM
        goods_brand a
        WHERE
        1 = 1
        ORDER BY
        a.orderNum ASC`);
        return this.formatBrandList (list , 'name' , indexes);
    }

    async info (id , entity) {
        let item = await entity.findOne ({id});
        return item;
    }

    /**
     * 数据 按照 拼音首字母 排序 并分组
     *
     * @param {Json} data ; 需要 排序的 数据
     * @param {String} field ；必须；排序所依据的 字段 名
     *
     * @return {Json} ; 例如：{A:[{},{}],B:[{},{}],C:[{}],#:[]}
     */
    data_letter_sort (data , field) {
        var letter_reg = /^[A-Z]$/;
        var list = new Array ();
        for (var i = 0 ; i < data.length ; i ++) {
            // 添加 # 分组，用来 存放 首字母不能 转为 大写英文的 数据
            list['#'] = new Array ();
            // 首字母 转 大写英文
            let letter = (data[i][field]).substr (0 , 1).toUpperCase ();
            // 是否 大写 英文 字母
            if ( !letter_reg.test (letter) ) {
                letter = '#';
            }
            // 创建 字母 分组
            if ( !(letter in list) ) {
                list[letter] = new Array ();
            }
            // 字母 分组 添加 数据
            list[letter].push (data[i]);
        }
        // 转换 格式 进行 排序；
        var resault = new Array ();
        for (var key in list) {
            resault.push ({
                letter : key ,
                list : list[key]
            });
        }
        resault.sort (function (x , y) {
            return x.letter.charCodeAt (0) - y.letter.charCodeAt (0);
        });
        // # 号分组 放最后
        var last_arr = resault[0];
        resault.splice (0 , 1);
        resault.push (last_arr);

        // 转换 数据 格式
        var json_sort = {};
        for (var i = 0 ; i < resault.length ; i ++) {
            json_sort[resault[i].letter] = resault[i].list;
        }

        // let arr:any[] = Object.values(json_sort)
        // let arr2:any[] = []
        // arr.forEach(small=>{
        //     small.forEach(item=>{
        //         arr2.push(item)
        //     })
        // })
        // return arr2

    }

    formatBrandList (arr , keyword , indexes) {
        // let newArr1:any[] = [];
        // let tempArr:any[] = [];
        // let reg = /\b(\w)|\s(\w)/g;
        // let k = 0;
        // let firstWord = arr[0][keyword].charAt(0).toUpperCase();//获取第一个分类字母
        // arr.map((v) => {
        //     v[keyword] = v[keyword].replace(reg,m=>m.toUpperCase());//首字母大写
        //     if(firstWord == v[keyword].charAt(0)){
        //         tempArr.push(v);
        //         newArr1[k] = {
        //             title:firstWord,
        //             key:firstWord,
        //             items:tempArr
        //         }
        //     }else{
        //         //这里循环到这表示已经第二个字母了
        //         firstWord = v[keyword].charAt(0);//设置第二字母
        //         tempArr = [];//把之前的清除掉
        //         tempArr.push(v);//添加第一个
        //         newArr1[++k] = {//自增
        //             title: firstWord,
        //             key:firstWord,
        //             items : tempArr
        //         }
        //     }
        // });
        // return newArr1;
        let map = {};
        let newArr : any[] = [];
        for (let i = 0 ; i < 26 ; i ++) {
            const key = String.fromCharCode (65 + i); //A-Z赋给key当作键
            map[key] = {
                title : key ,
                key : key ,
                items : []
            };
            arr.map ((v) => {      //遍历数组
                let firstIndex = v[keyword].charAt (0).toUpperCase ();//首字母
                if ( firstIndex.toUpperCase () == String.fromCharCode (65 + i) ) {//统一转成大写进行逐个判断
                    map[key].items.push (v);//push进相对应的数组里头
                }
            });
            // //如果当前的数组里头为空，则跳过。
            if ( map[key].items === undefined || map[key].items.length == 0 ) {
                continue;
            } else {
                newArr.push (map[key]);//将分类好的每个对象 合并在一个数组里面
            }
        }
        if ( indexes == '1' ) {
            return newArr;
        }
        let arr2 : any[] = [];
        newArr.forEach (small => {
            small.items.forEach (item => {
                arr2.push (item);
            });
        });
        return arr2;
    }

}
